package com.gdust.spzx.common.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ClassName: Knife4jConfig
 * Package: com.gdust.spzx.common.config
 * Description:
 * Swagger 配置类，用于定义和管理 API 接口文档分组以及接口的基础信息。
 * <p>
 * 注解说明：
 * - `@Configuration`：声明这是一个 Spring 配置类，用于配置 Bean。
 * <p>
 * 功能描述：
 * - 配置不同 API 的分组（如 admin-api 和 web-api）。
 * - 自定义接口文档的基础信息（如标题、版本、描述等）。
 *
 * @Author syun
 * @Create 2024/11/2 21:13
 * @Version 1.0
 */
@Configuration // 标记为 Spring 配置类
public class Knife4jConfig {

    /**
     * 创建用户相关API的分组。该分组会在Swagger UI中显示为"User API"分组，路径匹配 "/api/**"。
     *
     * @return GroupedOpenApi对象，包含用户API的分组配置信息
     */
    @Bean
    public GroupedOpenApi userApi() {
        return GroupedOpenApi.builder()
                .group("user-api")         // 分组名称
                .pathsToMatch("/api/**")  // 匹配 "/api/**" 的路径
                .build();
    }

    /**
     * 配置 admin-api 分组。
     * <p>
     * 该分组用于定义所有与 `/admin/**` 路径匹配的接口。
     * 分组名称：`admin-api`
     *
     * @return GroupedOpenApi 对象，用于生成 admin-api 分组的接口文档。
     */
    @Bean
    public GroupedOpenApi adminApi() {
        return GroupedOpenApi.builder()
                .group("admin-api")         // 定义分组名称
                .pathsToMatch("/admin/**")  // 设置分组匹配的路径规则
                .build();                   // 构建分组对象
    }

    /**
     * 自定义接口文档信息。
     * <p>
     * 用于定义 API 文档的全局信息，包括标题、版本、描述和联系作者信息。
     *
     * @return OpenAPI 对象，包含接口文档的基础信息。
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("环甑选API接口文档")          // 接口文档标题
                        .version("1.0")                     // 文档版本
                        .description("环甑选API接口文档")     // 文档描述
                        .contact(new Contact()
                                .name("syun")));             // 联系人信息
    }

    /**
     * 配置 web-api 分组。
     * <p>
     * 该分组用于定义所有与 `/api/**` 路径匹配的接口。
     * 分组名称：`web-api`
     *
     * @return GroupedOpenApi 对象，用于生成 web-api 分组的接口文档。
     */
    @Bean
    public GroupedOpenApi webApi() {
        return GroupedOpenApi.builder()
                .group("web-api")         // 定义分组名称
                .pathsToMatch("/api/**")  // 设置分组匹配的路径规则
                .build();                 // 构建分组对象
    }

}
